package com.obelisco.modelo.dao.hibernate;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.dao.IBitacoraDAO;
import com.obelisco.modelo.data.Bitacora;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.TipoEvento;

public class BitacoraDAO extends HibernateDAO<Bitacora> implements IBitacoraDAO {
	
	@Override
	public Bitacora findByPK(Serializable clave) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Bitacora> loadAll() {
		return loadAll(Bitacora.class);
	}

	
	ClassValidator<Bitacora> bitacoraValidator = new ClassValidator<Bitacora>(Bitacora.class,ResourceBundle.getBundle("com.obelisco.modelo.data.hibernate-validator"));
	
	public void validate(Bitacora objeto) {

		InvalidValue[] validationMessages =  bitacoraValidator.getInvalidValues(objeto);

		StringBuffer errores = new StringBuffer();
		for (InvalidValue invalidValue : validationMessages)
			errores.append(invalidValue.getPropertyName() + " - "+ invalidValue.getMessage() + "<br/>");
		
		if (errores.length() > 0)
			throw new ObeliscoException(errores.toString());
	}
	
	@Override
	public void save(Bitacora objeto) {
		
		validate(objeto);
		getHibernateTemplate().saveOrUpdate(objeto);
	}

	@SuppressWarnings("unchecked")
	public List<Bitacora> findByProperty(String propertyName, Object value) {
		String queryString = "from Bitacora model where model."
				+ propertyName + "= ?";
		return getHibernateTemplate().find(queryString, value);
	}

	@SuppressWarnings("unchecked")
	public List<Bitacora> find(Sistema sistema, TipoEvento evento, Date fechaInicio,
			Date fechaFin, String usuario, String fuente) {
		Session session = getSession();
		
		Criteria c = session.createCriteria(Bitacora.class);
		
		c.add(Expression.eq("sistema", sistema));
		
		if (evento != null)
			c.add(Expression.eq("tipoevento", evento));
		
		if (usuario != null && usuario.trim().length() > 0)
			c.add(Expression.like("usuario", usuario));
		
		if (fuente != null && fuente.trim().length() > 0)
			c.add(Expression.like("fuente", fuente));

		c.add(Expression.ge("fecha", fechaInicio));
		c.add(Expression.le("fecha", fechaFin));
		
		return c.list();
	}

	public List<Bitacora> loadAll(Sistema sistema) {
		// TODO Auto-generated method stub
		return findByProperty("sistema", sistema);
	}

}
